// 作为模板参数的引用
// 在C++模板中，引用可以作为模板参数使用，但这带有一些特定的行为和限制：

// 引用模板参数的关键点
// 1.语法和声明：你可以这样声明带有引用参数的模板：
template <typename T, T &REF>
class RefTemplate
{
    // ...
};

// 2.引用参数的要求：
// 被引用的对象必须具有外部链接或是静态成员
// 被引用的对象必须在整个程序执行期间存在
// 引用必须指向特定对象，不能是临时对象

// 3.使用场景：
// 访问全局对象或类的静态成员
// 实现基于策略的设计，其中策略由对象表示
// 创建依赖于特定对象实例的编译时常量

// 4.限制：
// 不能使用局部变量作为引用模板参数
// 不能使用函数参数作为引用模板参数
// 不能绑定到临时对象

// 示例
// 具有外部链接的全局对象
int globalValue = 42;

// 带有引用参数的模板
template <int &Value>
class IntRefUser
{
public:
    static void increment()
    {
        ++Value; // 修改被引用的对象
    }

    static int get()
    {
        return Value;
    }
};

// 使用方式
using MyIntRef = IntRefUser<globalValue>;

// 与指针参数的比较
// 作为模板参数的引用与指针在几个方面有所不同：
// 引用不能为空
// 引用不能重新绑定到不同的对象
// 引用提供了更直接的语法来访问被引用的对象

// 常见陷阱
// 尝试使用对局部变量或临时对象的引用
// 不理解生命周期要求
// 混淆引用模板参数和引用模板参数
// 这个特性在模板元编程和基于策略的设计中特别有用，在这些场景中你需要在编译时访问特定对象。
